package com.atguigu.java;

/**
 * 使用同步代码块解决继承Thread类的方式的线程安全问题
 * <p>
 * 例子：创建三个窗口卖票，总票数为100张,使用Runnable接口的方式
 *
 * 说明：在继承Thread类创建多线程的方式中，慎重使用this充当同步监视器，可以使用当前
 *      类充当同步监视器。
 *
 *
 */
class Window2 extends Thread {

    private static int ticket = 100;

    //加入static，否则锁没用
    private static Object obj = new Object();

    @Override
    public void run() {
        while (true) {

            synchronized (obj){//synchronized(this){
                try {
                    Thread.currentThread().sleep(100);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName() + "买票，票号为：" + ticket);
                    ticket--;
                } else {
                    break;
                }
            }
        }
    }
}

public class WindowTest2 {
    public static void main(String[] args) {
        Window2 t1 = new Window2();
        Window2 t2 = new Window2();
        Window2 t3 = new Window2();


        t1.setName("窗口一");
        t2.setName("窗口二");
        t3.setName("窗口三");

        t1.start();
        t2.start();
        t3.start();
    }
}